package tuling.design.mode.singleton;

/**
 * 单例懒加载模式
 * 单例：只初始化一次
 * 懒加载：实际使用时创建
 */
public class LazyLoding {
    /**
     * volatile : 防止指令重排序
     */
    private static volatile LazyLoding instance;

    private LazyLoding() {

    }

    public static LazyLoding getInstance() {
        //没有实例就创建实例
        if (instance == null) {
            //加锁
            synchronized (LazyLoding.class) {
                /**
                 * 1、空间开辟
                 * 2、给对应的空间初始化
                 * 3、给引用赋值
                 * 但是2或3 顺序可能颠倒 即先给引用赋值再给对应的空间初始化，在多线程的场景下，第一个线程给引用赋值了，
                 * 但是还没有初始化空间，后面的线程来使用时，就会出现null指针等异常，解决办法就是加上volatile关键字，阻止指令重排
                 */
                if (instance == null) {
                    System.out.println("开始创建--懒汉--单例");
                    instance = new LazyLoding();
                }
            }
        }
        return instance;
    }
}
